import { Context } from "./Context";
import { MethodTooOftenError } from "./errors";
import { Role } from "./Role";

/**
 * 记得重写 static methodName 属性，它表示技能名字。
 */
export abstract class Method {
    /** 释放间隔 */
    public abstract CD: number;
    /** 上一次调用的时间 */
    public callTime = 0;
    /** 技能的描述 */
    public abstract describe: string;
    /** 技能的名称 */
    static methodName: string;

    get game() {
        return this.masterRole.game;
    }

    /**
     * 
     * @param masterRole 这个技能所属角色
     */
    constructor(public masterRole: Role) {

    }


    /** 返回技能的名称 */
    public getName() {
        return (this.constructor as typeof Method).methodName;
    }
    test(command: string): boolean { return this.getName() === command };
    /**
     * 释放技能(限制CD)
     */
    limieInvoke(context: Context) {
        if (this.getNextCallTime() != 0) {
            throw new MethodTooOftenError()
        } else {
            // 内部调用不限制方法实现过程
            this.invoke(context);// 先释放技能，如果报错则不扣除时间
            this.callTime = Date.now();
        }

    };
    /** 释放技能(不限制) */
    abstract invoke(context: Context): void;
    /**
     * 获取距离下一调用的时间(毫秒)
     */
    public getNextCallTime(): number {
        // 结果 = 下一次释放时间 - 现在时间。正数表示剩余时间 负数表示可以释放
        const time = (this.callTime + this.CD) - Date.now()
        return time <= 0 ? 0 : time;
    }
}

/**
 * 仅表示 Method 的子类，实际运行中不会运行。
 */
//@ts-ignore
export class MethodSubClass extends Method { };